package cn.tedu.cinema.user.service.impl;

import cn.tedu.cinema.base.exception.ServiceException;
import cn.tedu.cinema.base.response.JsonResult;
import cn.tedu.cinema.base.response.StatusCode;
import cn.tedu.cinema.employee.pojo.vo.EmployeeVO;
import cn.tedu.cinema.user.mapper.UserMapper;
import cn.tedu.cinema.user.pojo.dto.UserLoginParam;
import cn.tedu.cinema.user.pojo.dto.UserQuery;
import cn.tedu.cinema.user.pojo.dto.UserSaveParam;
import cn.tedu.cinema.user.pojo.dto.UserUpdateParam;
import cn.tedu.cinema.user.pojo.entity.User;
import cn.tedu.cinema.user.pojo.vo.UserRegistrationVO;
import cn.tedu.cinema.user.pojo.vo.UserVO;
import cn.tedu.cinema.user.service.UserService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/* 业务层实现类需要添加@Service注解,表示该类为业务层实现类 */
@Slf4j
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    UserMapper userMapper;

    @Override
    public UserVO login(UserLoginParam userLoginParam) {
        log.debug("登录业务,参数:{}",userLoginParam);
        //根据前端传来的用户名查询数据库中是否有此用户的数据 Alt+Enter
        UserVO userVO = userMapper.selectByUsername(userLoginParam.getUsername());
        /* 如果业务层遇到了问题,不可以直接给前端响应,要抛出异常,由全局异常处理器来处理! */
        log.debug("登录业务,参数:{}",userVO);
        if(userVO == null){
            throw new ServiceException(StatusCode.USERNAME_ERROR);
        }
        if(!userVO.getPassword().equals(userLoginParam.getPassword())){
            throw new ServiceException(StatusCode.PASSWORD_ERROR);
        }
        if(userVO.getStatus().equals("已注销")){
            throw new ServiceException(StatusCode.USERNAME_ALREADY_NOEXISTS);
        }
        /* 如果没有抛出异常,业务层会将正常处理完毕的userVO结果返回给Controller层
        再由Controller层响应给前端 */
        return userVO;
    }

    @Override
    public JsonResult saveUser(UserSaveParam userSaveParam) {
        log.debug("保存用户业务,参数:{}",userSaveParam);
        if(!userSaveParam.getPassword().equals(userSaveParam.getRePassword())){
            log.warn("密码与确认密码不一致");
            return JsonResult.error(StatusCode.PASSWORD_REPASSWORD);
        }
      //  try {
            List<UserRegistrationVO> userRegistrationVOList = userMapper.selectUserName();

            // 检查用户名是否已存在
            boolean usernameExists = userRegistrationVOList.stream()
                    .anyMatch(vo -> vo.getUsername().equals(userSaveParam.getUsername()));
            if (usernameExists) {
                log.warn("用户名已存在: {}", userSaveParam.getUsername());
                return JsonResult.error(StatusCode.USERNAME_ALREADY_EXISTS);
            }

            // 检查手机号是否已存在
            boolean phoneExists = userRegistrationVOList.stream()
                    .anyMatch(vo -> vo.getPhone().equals(userSaveParam.getPhone()));
            if (phoneExists) {
                log.warn("手机号已存在: {}", userSaveParam.getPhone());
                return JsonResult.error(StatusCode.PHONE_ALREADY_EXISTS);
            }

            // 创建新的 User 实例并设置属性
            User user = new User();
            user.setUsername(userSaveParam.getUsername());
            user.setPassword(userSaveParam.getPassword()); // 注意：生产环境中请加密存储密码
            user.setPhone(userSaveParam.getPhone());
            user.setRegistrationDate(new Date());

            // 插入新用户到数据库
            userMapper.insert(user);

            log.info("用户保存成功, 用户名: {}", userSaveParam.getUsername());
            return JsonResult.ok();
      //  }
        //catch (Exception e) {
//            log.error("保存用户时发生异常", e);
//            return JsonResult.error(StatusCode.OPERATION_FAILED);
//        }
    }

    @Override
    public PageInfo<UserVO> selectUser(int pageNum, int pageSize, UserQuery userQuery) {
        log.debug("查询用户业务,参数:{}",userQuery);
        PageHelper.startPage(pageNum, pageSize);
        List<UserVO> list = userMapper.selectUser(pageNum,pageSize,userQuery);
        for (UserVO user :list) {
            if (user.getMemberLevel() == null || user.getMemberLevel().isEmpty()) {
                user.setMemberLevel("无会员"); // 设置默认级别
                if(user.getEmail()==null|| user.getEmail().isEmpty()){
                    user.setEmail("待完善");
                }
            }
        }
        PageInfo<UserVO> pageInfo = new PageInfo<>(list);
        return pageInfo;
    }

    @Override
    public JsonResult updatePassword(UserUpdateParam userUpdateParam) {
        log.debug("修改密码业务,参数:{}",userUpdateParam);
        UserVO userVO = userMapper.selectByUsername(userUpdateParam.getUsername());
         if (!userVO.getPassword().equals(userUpdateParam.getPassword()) ||
                !userVO.getPhone().equals(userUpdateParam.getPhone())) {
             return JsonResult.error(StatusCode.DATA_UNCOMMON);
         }
         else if(userUpdateParam.getPassword().equals(userUpdateParam.getUpdatePassword())){
               return  JsonResult.error(StatusCode.PASSWORD_UPDATEPASSWORD);
        }else{
           return  JsonResult.ok();
         }

    }

    @Override
    public void updateStatus(Long userId, String status) {
        log.debug("修改用户状态业务,参数:{},{}",userId,status);
        User user = new User();
        user.setId(userId);
        user.setStatus(status);

        userMapper.update(user);
    }

    @Override
    public void deleteUser(Long userId) {
        log.debug("删除用户业务,参数:{}",userId);
        userMapper.deleteById(userId);
    }

    @Override
    public List<UserVO> selectAuditList(Long parentId) {
        log.debug("查询审批列表业务,参数:{}",parentId);
        //1.准备一个空集合,用来保存查出来的多个审批人
        ArrayList<UserVO> userVOList = new ArrayList<>();
        //2.先根据传过来的上级id(其实也是用户id)将直属领导查出来,装到上方集合里
        UserVO auditUser1 = userMapper.selectById(parentId);
        userVOList.add(auditUser1);
        //3.判断是否有直属领导,且直属领导还有上级

        //5.将准备好的审批人集合返回给controller
        return userVOList;
    }

    @Override
    public JsonResult updateUser(UserUpdateParam userUpdateParam) {
        log.debug("业务层获取编辑信息：参数={}",userUpdateParam);
        List<UserRegistrationVO> userRegistrationVOList = userMapper.selectUserName();

        // 检查用户名是否已存在
        boolean usernameExists = userRegistrationVOList.stream()
                .filter(vo -> !vo.getId().equals(userUpdateParam.getId())) // 排除当前用户
                .anyMatch(vo -> vo.getUsername().equals(userUpdateParam.getUsername()));
        if (usernameExists) {
            log.warn("用户名已存在: {}", userUpdateParam.getUsername());
            return JsonResult.error(StatusCode.USERNAME_ALREADY_EXISTS);
        }

        // 检查手机号是否已存在
        boolean phoneExists = userRegistrationVOList.stream()
                .filter(vo -> !vo.getId().equals(userUpdateParam.getId())) // 排除当前用户
                .anyMatch(vo -> vo.getPhone().equals(userUpdateParam.getPhone()));
        if (phoneExists) {
            log.warn("手机号已存在: {}", userUpdateParam.getPhone());
            return JsonResult.error(StatusCode.PHONE_ALREADY_EXISTS);
        }

        if(userUpdateParam.getEmail()!=null) {
            boolean emailExists = userRegistrationVOList.stream()
                    .filter(vo -> !vo.getId().equals(userUpdateParam.getId())) // 排除当前用户
                    .anyMatch(vo -> userUpdateParam.getEmail().equals(vo.getEmail()));
            if (emailExists) {
                log.warn("邮箱已存在: {}", userUpdateParam.getEmail());
                return JsonResult.error(StatusCode.EMAIL_ALREADY_EXISTS);
            }
        }
        User user = new User();
            user.setId(userUpdateParam.getId());
            user.setUsername(userUpdateParam.getUsername());
        if(userUpdateParam.getEmail()!=null){
        user.setEmail(userUpdateParam.getEmail());
        }
            user.setPhone(userUpdateParam.getPhone());
        log.debug("user的编辑信息：参数={}",user);
        userMapper.update(user);
        return  JsonResult.ok();
    }
}







